with Ada.Text_Io; use Ada.Text_Io;
with Dictionnaires;
with Ada.Command_Line;

procedure Test_Dico_Hash_3prem is

   Taille: constant Positive := 5;

   function Hash_3prem(Mot: String) return Natural is
   begin
      if Mot'Length >= 3 then
         return Character'Pos(Mot(Mot'First)) +
           Character'Pos(Mot(Mot'First + 1)) +
           Character'Pos(Mot(Mot'First + 2));
      elsif Mot'Length =2 then
         return Character'Pos(Mot(Mot'First)) +
           Character'Pos(Mot(Mot'First + 1));
      else -- mot'length=1
         return Character'Pos(Mot(Mot'First));
      end if;
   end Hash_3prem;

   package Dico_Hash_3prem is new Dictionnaires(Taille, False, Hash_3prem);

   Fich: File_Type; -- fichier de test contenant un dictionnaire
   -- dictionnaire :
   Dhb: Dico_Hash_3prem.Dictionnaire := Dico_Hash_3prem.Cree_Dico;

   Trouve : Boolean;
   laDef : Dico_Hash_3prem.Definition;

   -- compteur qui nous permet de savoir si le test est passé ou a échoué
   cptTest : Natural := 0;
begin

   declare -- un nouveau bloc
         S: String := "dico_gros.txt";
   begin
      Open(Fich, In_File, S);
      -- si on arrive ici ça veut dire qu'il n'y a pas eu d'exception
      -- et que le fichier existe
      cptTest := cptTest + 1;
   exception
      when Name_Error => Put_Line("Error: fichier inexistant !"); return;
   end;

   -- remplissage du dictionnaire
   Dico_Hash_3prem.Remplit_Dico(Fich, Dhb);

   -- On test si on a bien redimensionner le dictionnaire après insertion
   if Dico_Hash_3prem.GetLength(Dhb) = 10 then
       -- la redimension a bien fonctionnée
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: La redimension du dictionnaire a échoué, la taille doit être de 10");
   end if;

   -- suppresion mot "quatremot"
   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("quatremot"), Trouve, laDef);
   
   if Trouve then
      -- quatremot existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: quatremot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Trouve(Dhb, Dico_Hash_3prem.Cree_Mot("nawak"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("Error: nawak a été trouvé, voici la définition : " & laDef.S);
   else
      -- nawak n'existe pas, on incremente
      cptTest := cptTest + 1;
   end if;

   Dico_Hash_3prem.Trouve(Dhb, Dico_Hash_3prem.Cree_Mot("deuxmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: deuxmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("vingtetunmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: vingtetunmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("vingtmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: vingtmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("dixneufmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: dixneufmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("dixhuitmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: dixhuitmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("dixseptmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: dixseptmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("seizemot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: seizemot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("quinzemot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: quinzemot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("quatorzemot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: quatorzemot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("treizemot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: treizemot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("douzemot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: douzemot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("onzemot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: onzemot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("dixmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: dixmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("neufmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: neufmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("huitmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: huitmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("septmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: septmot n'a pas été trouvé");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("sixmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: sixmot n'a pas été trouvé");
   end if;

   -- On test si on a bien redimensionner le dictionnaire après suppression
   if Dico_Hash_3prem.GetLength(Dhb) = 5 then
       -- la redimension a bien fonctionnée
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: La redimension du dictionnaire a échoué, la taille doit être de 5");
   end if;

   Dico_Hash_3prem.Supprime(Dhb, Dico_Hash_3prem.Cree_Mot("cinqmot"), Trouve, laDef);
   if Trouve then
      -- il existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: cinqmot n'a pas été trouvé");
   end if;

    -- on test si on a bien supprimé 18 mots
   if Dico_Hash_3prem.GetTaille(Dhb) = 3 then
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: les mots n'ont pas été bien supprimés");
   end if;

   Dico_Hash_3prem.Vider(Dhb);

   -- on test si le dico a bien été vidé
   if Dico_Hash_3prem.GetTaille(Dhb) = 0 then
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: la table de hachage n'a pas été bien vidée");
   end if;

   -- fermeture du fichier test
   Close(Fich);

   -- on test si les 25 tests se sont bien réalisés
   if cptTest = 25 then
      Ada.Command_Line.Set_Exit_Status (Code => Ada.Command_Line.Success);
   else
      Ada.Command_Line.Set_Exit_Status (Code => Ada.Command_Line.Failure);
   end if;

end Test_Dico_Hash_3prem;
